987
12421
Nějakou dobu jsem si pohrával s JSONem, jen jsem ho vytlačil jako text a nikomu to neublížilo (o čemž vím), ale rád bych začal dělat věci správně.
Viděl jsem tolik údajných „standardů“ pro typ obsahu JSON:
aplikace / JSON
application / x-javascript
text / javascript
text / x-javascript
text / x-json
Ale který z nich je správný nebo nejlepší? Shromažďuji, že existují problémy s bezpečností a podporou prohlížeče, které se mezi nimi liší.
Vím, že existuje podobná otázka, jaký typ MIME, pokud je JSON vrácen pomocí REST API ?, ale chtěl bych o něco cílenější odpověď. 
1
2
další
Pro text JSON:
aplikace / JSON
Typ média MIME pro text JSON je application / json. Výchozí kódování je UTF-8. (Zdroj: RFC 4627).
Pro JSONP (spustitelný JavaScript) se zpětným voláním:
aplikace / javascript
Zde je několik příspěvků na blogu, které byly zmíněny v příslušných komentářích:
Proč byste neměli používat text / html pro JSON
Internet Explorer má někdy problémy s aplikací / json
Poměrně úplný seznam mimetypů a toho, k čemu je použít
Oficiální seznam typů mime na IANA z níže uvedené odpovědi @ gnrfan
|
IANA zaregistrovala oficiální typ MIME pro JSON jako application / json.
Když jsme dotázáni, proč ne text / json, zdá se, že Crockford řekl, že JSON není ve skutečnosti JavaScript ani text a také IANA pravděpodobně rozdávala aplikace / * než text / *.
Další zdroje:
Druhy médií
Žádost o komentář 4627
bluesmoon: JSON má typ
|
Pro JSON:
Typ obsahu: aplikace / json
Pro JSON-P:
Typ obsahu: aplikace / javascript
|
Správný typ média MIME pro JSON je samozřejmě application / json, ale je nutné si uvědomit, jaký typ dat se ve vaší aplikaci očekává.
Například používám Ext GWT a odpověď serveru musí jít jako text / html, ale obsahuje data JSON.
Na straně klienta, posluchač formuláře Ext GWT
uploadForm.getForm (). addListener (nový FormListenerAdapter ()
{
@ Přepis
public void onActionFailed (formulářový formulář, int httpStatus, řetězec responseText)
{
MessageBox.alert („chyba“);
}
@ Přepis
public void onActionComplete (formulářový formulář, int httpStatus, řetězec responseText)
{
MessageBox.alert ("Úspěch");
}
});
V případě použití typu odpovědi aplikace / json mi prohlížeč navrhuje uložit soubor.
Fragment zdrojového kódu na straně serveru pomocí Spring MVC
vrátit nový AbstractUrlBasedView ()
{
@SuppressWarnings („nezaškrtnuto“)
@ Přepis
protected void renderMergedOutputModel (model mapy, požadavek HttpServletRequest,
HttpServletResponse response) vyvolá výjimku
{
response.setContentType ("text / html");
response.getWriter (). write (json);
}
};
|
JSON:
Odpověď jsou dynamicky generovaná data podle parametrů dotazu předaných v adrese URL.
Příklad:
{"Name": "Foo", "Id": 1234, "Rank": 7}
Typ obsahu: aplikace / json
JSON-P:
JSON s polstrováním.
Odezvou jsou data JSON a kolem nich je zabaleno volání funkce.
Příklad:
functionCall ({"Name": "Foo", "Id": 1234, "Rank": 7});
Typ obsahu: aplikace / javascript
|
Pokud používáte Ubuntu nebo Debian a obsluhujete soubory .json prostřednictvím Apache, možná budete chtít poskytovat soubory se správným typem obsahu. Dělám to především proto, že chci použít rozšíření JSONView pro Firefox
Modul Apache mod_mime to pomůže udělat snadno. U Ubuntu však musíte upravit soubor /etc/mime.types a přidat řádek
aplikace / json json
Poté restartujte Apache:
sudo služba apache2 restart
|
Pokud voláte webové služby ASP.NET z klientské strany, musíte použít aplikaci / json, aby fungovala. Věřím, že je to stejné pro rámce jQuery a Ext.
|
Správný typ obsahu pro JSON je application / json UNLESS, který používáte JSONP, také známý jako JSON s Padding, což je ve skutečnosti JavaScript, a správný typ obsahu by tedy byl application / javascript.
|
Není pochyb o tom, že application / json je nejlepší typ MIME pro odpověď JSON.
Ale měl jsem nějaké zkušenosti, kde jsem musel použít application / x-javascript kvůli některým problémům s kompresí. Moje hostitelské prostředí je sdílený hosting s GoDaddy. Neumožňují mi měnit konfigurace serveru. Přidal jsem následující kód do svého souboru web.config pro kompresi odpovědí.
















Tímto způsobem byly stránky .aspx komprimovány pomocí g-zip, ale odpovědi JSON nebyly. přidal jsem

v oddílech statického a dynamického typu. Ale to vůbec nekomprimuje odpovědi JSON.
Poté jsem odstranil tento nově přidaný typ a přidal

v oddílech statického i dynamického typu a změnil typ odpovědi v
.ashx (asynchronní obslužný program) do
application / x-javascript
A teď jsem zjistil, že moje odpovědi JSON byly komprimovány pomocí g-zip. Osobně tedy doporučuji použít
application / x-javascript
pouze pokud chcete komprimovat své odpovědi JSON ve sdíleném hostitelském prostředí. Protože ve sdíleném hostingu vám neumožňují změnit IISkonfigurace.
|
Pouze při použití aplikace / json jako typu MIME mám následující (od listopadu 2011 s nejnovějšími verzemi prohlížeče Chrome, Firefox s Firebug):
Už žádná varování z Chromu, když je JSON načten ze serveru.
Firebug přidá do odpovědi kartu zobrazující data JSON
formátovaný. Pokud je typ MIME odlišný, zobrazí se pouze jako
„Obsah odpovědi“.
|
Ne vše funguje pro typ obsahu application / json.
Pokud používáte odeslat formulář Ext JS k odeslání souboru, mějte na paměti, že prohlížeč analyzuje odpověď serveru a vytvoří dokument pro